/**
 *	@file	pm_tel.h
 *	@brief	ポケモン　電話システム
 *	@author	Miyuki Iwasawa
 *	@date	07.10.24
 */

#ifndef __H_PM_TEL_H__
#define __H_PM_TEL_H__

#include "system/wordset.h"
#include "field/eventflag.h"
#include "savedata/gametime.h"
#include "savedata/pgear_sv.h"
#include "tel/pmtel_book.h"
#include "system/selbox.h"

#include "pgtel_def.h"

typedef struct _PGTEL_SYS_WORK* PGTEL_SYS_WORK_PTR;

#define TEL_CALL_SE_NUM	(3)

typedef struct{
 int	main_seq;	///<メインシーケンス
 int	seq;		///<会話シーケンス
 int	sub_seq;	///<会話シーケンスサブ
 int	local_seq;	///<会話シーケンスローカル

 PMTEL_BOOK* pbk;	///<カレントターゲットの電話データポインタ
 void*		 data;

 u8	id;				///<ターゲットID
 u8	is_receive;		///<着信モードフラグ
 u8	ev_type;		///<イベントタイプ
 u8	msgidx;			///<メッセージindex

 u16 ev_id;			///<イベントID
 u16 seq_no;		///<会話パターンナンバー
 u16 seq_code;		///<会話シーケンスタイプ

 u8	kt_status;		///<キータッチステータス
 u8	time_zone;		///<タイムゾーン
 u16	ct;			///<汎用カウンター

 RTCDate	rtc_date;
 RTCTime	rtc_time;

 //汎用バッファ
 u32	tmp_u32;
 u16	tmp_u16;
 u8		tmp_u8;
 u8		tmp_buf[2];
 u8		tmp_flag1:1;
 u8		tmp_flag2:1;
 u8		tmp_flag3:1;
 u8		tmp_flag4:1;
 void*	tmp_wk;
}PMTEL_TALK_WORK;

typedef struct{
 int	heapID;	///<ヒープ

 PGTEL_SYS_WORK_PTR tel_sys_work;

 GF_BGL_INI*	bgl;		///<BGLへの参照ポインタ
 GF_BGL_BMPWIN*	win_msg;	///<メッセージウィンドウ
 GF_BGL_BMPWIN*	win_name;	///<ネームウィンドウ
 SELBOX_WORK*	list_wk;	///<選択ボックスワーク
 PALETTE_FADE_PTR	palAnm;	///<パレットフェードワーク

 SAVEDATA*			save;	///<セーブデータ
 PMTEL_SAVE*		tel_sv;	///<電話セーブデータ
 const MYSTATUS*	my_sv;	///<
 EVENTWORK*			ev_sv;	///<
 GMTIME*			time;		///<ゲーム内時間

 u16	zone_id;		///<自機が今いるゾーンID
 u16	field_zone;		///<自機がいるマップ上のゾーンID
 u8		msg_spd;		///<メッセージ再生スピード
 u8		msg_idx;		///<メッセージindex
 u8		my_sex;			///<自機の性別
 u8		msg_tbl[2];		///<メッセージID格納汎用バッファ
 int*	pKeymode;		///<キーモード
 CLACT_WORK_PTR act_btn;	///<タッチパネルボタンアクター

 MSGDATA_MANAGER* msgMan;	///<メッセージマネージャ
 MSGDATA_MANAGER* m_gt;		///<メッセージマネージャ
 MSGDATA_MANAGER* m_person;		///<メッセージマネージャ

 WORDSET* wset;		///<ワーク
 STRBUF* str_tmp;	///<テンポラリバッファ(1行分)
 STRBUF* str_name;	///<テンポラリバッファ(名前取得用)
 STRBUF* str_trtype;	///<テンポラリバッファ(トレーナータイプ取得用)
 STRBUF* str_tr_tmp;	///<テンポラリバッファ(トレーナータイプ取得用)
 STRBUF* str_talk;	///<テンポラリバッファ(メッセージ)
 STRBUF* str_call_s[TEL_CALL_SE_NUM];
 STRBUF* str_call_e[TEL_CALL_SE_NUM];

 PMTEL_BOOK_MAN*	pBookMan;	///<電話帳データマネージャ
 const PMTEL_BOOK*	book;		///<データテーブルへのポインタ
 PMTEL_TALK_WORK	twk;	///<会話処理制御ワーク
}PMTEL_DATA_MAN;

///電話データマネージャ初期化パラメータ格納構造体型
typedef struct{
 int	heapID;
 int*	pKeymode;		///<キーモード

 CLACT_WORK_PTR act_btn;	///<タッチパネルボタンアクター

 PGTEL_SYS_WORK_PTR tel_sys_work;
 GF_BGL_INI*	bgl;		///<BGLへの参照ポインタ
 GF_BGL_BMPWIN*	win_msg;	///<メッセージウィンドウ
 GF_BGL_BMPWIN*	win_name;	///<ネームウィンドウ
 PALETTE_FADE_PTR	palAnm;	///<パレットフェードワーク

 SAVEDATA*			save;		///<セーブ
 PMTEL_SAVE*		tel_save;	///<電話セーブデータ
 const MYSTATUS*	my_save;	///<MYSTATSUの参照ポインタ
 EVENTWORK*			ev_save;	///<
 GMTIME*			time;		///<ゲーム内時間

 u16	zone_id;		///<自機が今いるゾーンID
 u16	field_zone;		///<自機がいるフィールドマップゾーン
 u8		msg_spd;		///<メッセージ再生スピード
}PMTEL_DATA_PARAM;

#include "pmtel_seq.h"

/**
 *	@brief	電話データのコントロールマネージャを作成
 *
 *	@param	heapID	ワークを確保するheapID
 */
extern PMTEL_DATA_MAN* PMTelData_Init(PMTEL_DATA_PARAM* prm);

/**
 *	@brief	電話データコントロールマネージャの破棄
 *
 */
extern void PMTelData_Release(PMTEL_DATA_MAN* wk);

/**
 *	@brief	電話　指定番号の人物名を取得
 *
 *	＊システム内のバッファに文字列を展開し、そのポインタを返す
 */
extern const STRBUF* PMTelData_GetNameStr(PMTEL_DATA_MAN* wk,PMTEL_NUMBER_ID id);


/**
 *	@brief	電話　指定番号のトレーナータイプ名を取得
 *
 *	＊システム内のバッファに文字列を展開し、そのポインタを返す
 */
extern const STRBUF* PMTelData_GetTrtypeStr(PMTEL_DATA_MAN* wk,PMTEL_NUMBER_ID id);

/**
 *	@brief	電話　ターゲットデータ取得＆会話内容抽選
 */
extern BOOL PMTelData_TalkTargetSet(PMTEL_DATA_MAN* wk,PMTEL_NUMBER_ID id,
		const BOOL is_reveive,const u8 ev_code,const u8 ptn_code);

/**
 *	@brief	電話　会話内容抽選
 */
extern void PMTelData_TalkDataSet(PMTEL_DATA_MAN* wk);

#endif //__H_PM_TEL_H__
